# Класс типов

Класс типов (_type class_) — это абстрактный параметризованный тип, 
который позволяет добавлять новое поведение к любому закрытому типу данных без использования подтипов. 
Если вы пришли с Java, то можно думать о классах типов как о чем-то вроде `java.util.Comparator[T]`.

В статье ["Type Classes as Objects and Implicits"][TypeClasses] (2010 г.) 
обсуждаются основные идеи, лежащие в основе классов типов в Scala. 
Несмотря на то, что в статье используется более старая версия Scala, идеи актуальны и по сей день.

Этот стиль программирования полезен во многих случаях, например:

- выражение того, как тип, которым вы не владеете, например, из стандартной или сторонней библиотеки, 
соответствует такому поведению
- добавление поведения к нескольким типам без введения отношений подтипов между этими типами
(например, когда один расширяет другой)

В Scala 3 классы типов — это просто trait-ы с одним или несколькими параметрами типа, например:

```dotty
trait Show[A]:
  def show(a: A): String
```

Экземпляры `Show` для определенного типа `A` свидетельствуют о том, 
что мы можем показать (т.е. создать текстовое представление) экземпляр типа `A`. 
Например, рассмотрим следующий экземпляр `Show` для `Int`:

```dotty
class ShowInt extends Show[Int]:
  def show(a: Int) = s"The number is ${a}!"
```

Можно написать методы, которые работают с произвольными типами `A`, ограниченными `Show`, следующим образом:

```dotty
def toHtml[A](a: A)(showA: Show[A]): String =
  "<p>" + showA.show(a) + "</p>"
```

То есть `toHtml` можно вызывать с произвольным `A`, если также предоставить экземпляр `Show[A]`. 
Например, метод можно вызвать так:

```dotty
toHtml(42)(ShowInt())
// res0: String = "<p>The number is 42!</p>"
```

##### Автоматическая передача экземпляров класса типов

Поскольку классы типов являются очень важным способом структурирования программного обеспечения, 
Scala 3 предлагает дополнительные функции, которые делают работу с ними очень удобной. 
Эти дополнительные функции, относящиеся к категории контекстуальных абстракций, 
рассматриваются в одной [из последующих глав](ca-type-classes.md).


---

**Ссылки:**

- [Scala3 book](https://docs.scala-lang.org/scala3/book/types-type-classes.html)
- [The Power of Type-classes with Scala implicit defs](https://blog.tmorris.net/posts/the-power-of-type-classes-with-scala-implicit-defs/index.html)
- [Why are Type Classes Useful in Scala? - Rock the JVM](https://blog.rockthejvm.com/why-are-typeclasses-useful/)

[TypeClasses]: https://infoscience.epfl.ch/record/150280/files/TypeClasses.pdf
